package com.example.demo.modules.sys.service.impl;

import cn.hutool.core.util.IdUtil;
import com.example.demo.config.Methods;
import com.example.demo.modules.sys.dto.fileStore.FileStoreDTO;
import com.example.demo.modules.sys.entity.FileStore;
import com.example.demo.modules.sys.dao.FileStoreMapper;
import com.example.demo.modules.sys.service.IFileStoreService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author lmy
 * @since 2023-02-06
 */
@Service
public class FileStoreServiceImpl extends ServiceImpl<FileStoreMapper, FileStore> implements IFileStoreService {

    @Resource
    private Methods methods;

    /**
     * 多文件上传
     * @param files
     * @return
     * @throws Exception
     */
    @Override
    public List<FileStoreDTO> upLoadFiles(MultipartFile[] files) throws Exception {
        List<FileStoreDTO> list = new ArrayList<>();
        for (MultipartFile file : files) {
            /**获取文件名，带后缀*/
            String originalFilename = file.getOriginalFilename();
            /**获取文件后缀格式*/
            String fileSuffix = originalFilename.substring(originalFilename.lastIndexOf(".") + 1).toLowerCase();
            /**获取文件大小转换GB/MB/KB*/
            long size = file.getSize();
            String length = null;
            if (size / (1024 * 1024) > 1024) {
                double size1 = size / (1024 * 1024 * 1024);
                size1 = (double) Math.round(size1 * 100) / 100;
                length = size1 + "GB";
            } else if (size / (1024) > 1024) {
                double size1 = size / (1024 * 1024);
                size1 = (double) Math.round(size1 * 100) / 100;
                length = size1 + "MB";
            } else if (size > 1024 && size < 1024 * 1024) {
                double size1 = size / 1024;
                size1 = (double) Math.round(size1 * 100) / 100;
                length = size1 + "KB";
            }
            /**文件重新命名，防止重复：id + 后缀*/
            String newFileName = IdUtil.simpleUUID() + "." + fileSuffix;
            /**获取当前工作目录*/
            String rootPath = methods.getUploadPath();
            /**获取当前日期作为子路径*/
            Date date = new Date();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            String datePath = sdf.format(date);
            /**原文件路径*/
            String originalPath = File.separator + datePath;
            /**修正后路径*/
            String modifiedPath = File.separator + datePath + File.separator + "Modified";
            /**小图路径*/
            String lowPath = File.separator + datePath + File.separator + "Low";
            /**缩略图路径*/
            String thumbPath = File.separator + datePath + File.separator + "Thumb";
            /**完整目录*/
            File originalFile = new File(rootPath + originalPath + File.separator + newFileName);
            /**修正后的目录*/
            File modifiedFile = new File(rootPath + modifiedPath + File.separator + newFileName);
            /**小图目录*/
            File lowFile = new File(rootPath + lowPath + File.separator + newFileName);
            /**缩略图目录*/
            File thumbFile = new File(rootPath + thumbPath + File.separator + newFileName);
            /**目录不存在则创建目录*/
            if (!originalFile.getParentFile().exists()) {
                originalFile.getParentFile().mkdirs();
            }
            if (!modifiedFile.getParentFile().exists()) {
                modifiedFile.getParentFile().mkdirs();
            }
            if (!lowFile.getParentFile().exists()) {
                lowFile.getParentFile().mkdirs();
            }
            if (!thumbFile.getParentFile().exists()) {
                thumbFile.getParentFile().mkdirs();
            }
            /**保存文件到指定路径*/
            file.transferTo(originalFile);
            /**保存文件信息到数据库*/
            FileStore sysFileStore = new FileStore();
            String fileId = UUID.randomUUID().toString().replace("-", "");
            sysFileStore.setId(fileId);
            /**文件名*/
            sysFileStore.setFileName(originalFilename);
            sysFileStore.setFileId(fileId);
            /**文件路径,隐藏磁盘路径,静态资源配置文件夹,使用ip端口+路径访问静态资源*/
            sysFileStore.setOriginalFile("upload" + originalPath + File.separator + newFileName);
            /**返回的文件信息*/
            FileStoreDTO fileStoreDto = new FileStoreDTO();
            BeanUtils.copyProperties(sysFileStore, fileStoreDto);
            fileStoreDto.setSize(length);
            fileStoreDto.setPath("upload" + originalPath + File.separator + newFileName);
            this.save(sysFileStore);
            list.add(fileStoreDto);
        }
        return list;
    }
}
